//
// Created by xinrong.qian on 2025/5/29.
//

#ifndef CV_CAL_CARDPICKPROCESSOR_H
#define CV_CAL_CARDPICKPROCESSOR_H


#include <opencv2/core/mat.hpp>
#include "tc_response_info.hpp"

class CardPickProcessor {

public:
    CardPickProcessor() = default;

    // 请求返回函数
    TcResponseInfo GetTcResponseInfo(const cv::Mat &image,
                                     int x, int y, int width, int height);
private:

    /**
     * 调试标志
     */
//    bool debugFlag = true;
    bool debugFlag = false;

    TcResponseInfo SuccessResponseInfo(const std::string &successMsg, const std::string &tcResult,
                                       const std::vector<double> &grayValues, int pc, int pt,
                                       double cValue, double tValue, double tcRatio);

    TcResponseInfo ErrorResponseInfo(const std::string &errorMsg);

    /**
     * TC阴阳性
     *
     * @param tcRatio  TC比值
     * @return
     */
    std::string calculateTcResult(double tcRatio);

    /**
     * 矫正图像，并裁剪黑边
     * @param input
     * @return
     */
    cv::Mat correctAndCropWhiteRectangle(const cv::Mat &input);

    /**
     * 计算无旋转矩形区域的像素值之和
     * @param image 输入图像
     * @param center 矩形中心点坐标 (x,y)
     * @param color 矩形颜色
     * @param width 矩形宽度
     * @param height 矩形高度
     * @return 矩形区域内像素值总和，-1表示出错
     */
    double calculateRectSum(const cv::Mat &image,
                            const cv::Point2f &center,
                            double width,
                            double height);

    /**
     * @brief 计算图像中四个点坐标的灰度值之和
     * @param image 输入图像（单通道或三通道）
     * @param points 包含四个点坐标的vector
     * @param invert 是否反转灰度值 true（255 - value）
     * @return 四个点的灰度值总和（若为三通道图像则返回BGR三通道和）
     * @throws std::invalid_argument 当输入不符合要求时抛出异常
     */
    int calculateGraySumAtPoints(const cv::Mat& image,
                                 const std::vector<cv::Point>& points, bool invert = true);

    /**
     * 绘制无旋转矩形
     * @param image 输入图片
     * @param center 矩形中心点坐标 (x,y)
     * @param width 矩形宽度
     * @param height 矩形高度
    */
    void visualizeRect(cv::Mat& image,
                       const cv::Point2f &center,
                       cv::Scalar_<double> color,
                       double width,
                       double height);

    /**
     * @brief 计算图像中指定正方形区域的灰度值总和（可选反转）
     *
     * @param image 输入图像（单通道）
     * @param center 中心点坐标
     * @param width 矩形宽（必须为奇数，如 3, 5, 7...）
     * @param height 矩形高（必须为奇数，如 3, 5, 7...）
     * @param invert 是否反转灰度值（255 - value）
     * @return double 灰度值总和
    */
    double calculateRectGraySum(const cv::Mat& image, const cv::Point& center, int width, int height, bool invert = false);


    /**
     * @brief 计算图像中每一行的灰度值总和（可选反转）
     *
     * @param image 输入图像（单通道）
     * @param invert 是否反转灰度值（255 - value）
     * @return std::vector<double> 每一行的灰度值总和
    */
    std::vector<double> calculateRowSums(const cv::Mat& image, bool invert = true);

    /**
     * 绘制曲线
     *
     * @param data
     * @param name
     */
    void drawCurve(const std::vector<double>& data, std::string &name);

    /**
     * 声明扫描图像均值计算
     *
     * @param imgGray
     * @param R
     * @return
     */
    std::vector<double>meanRoundRectangle(const cv::Mat &imgGray, int R);

};


#endif //CV_CAL_CARDPICKPROCESSOR_H
